package com.kkwrite.regimen.provider.service.module;

import com.kkwrite.regimen.common.constant.EntityEnum;
import com.kkwrite.regimen.common.entity.dto.module.ModuleDTO;
import com.kkwrite.regimen.common.entity.dto.module.ModuleItemDTO;
import com.kkwrite.regimen.provider.domain.RegModuleDO;
import com.kkwrite.regimen.provider.domain.RegModuleItemDO;
import com.kkwrite.regimen.provider.exception.ServiceException;
import com.kkwrite.regimen.provider.repository.RegModuleItemRepository;
import com.kkwrite.regimen.provider.repository.RegModuleRepository;
import com.kkwrite.regimen.provider.service.item.ItemService;
import com.kkwrite.regimen.provider.service.shop.ShopService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/** 
 * 模块服务
 *
 * @author Soosky Wang
 * @date 2018年7月22日 下午3:00:21 
 * @version 1.0.0
 */
@Service("moduleService")
public class ModuleServiceImpl implements ModuleService, ApplicationContextAware {
	
	private static final Logger logger = LoggerFactory.getLogger(ModuleServiceImpl.class);
	
	private ApplicationContext applicationContext;
	
	@Resource(name = "regModuleRepository")
	private RegModuleRepository regModuleRepository;
	@Resource(name = "regModuleItemRepository")
	private RegModuleItemRepository regModuleItemRepository;

	@SuppressWarnings("unchecked")
	@Override
	public ModuleDTO<?> getModuleContent(Long moduleId) throws ServiceException {
		if (logger.isDebugEnabled()) {
			logger.debug("ModuleServiceImpl.getModuleContent(), moduleId = {}", moduleId);
		}
		
		ModuleDTO moduleDTO = new ModuleDTO();
		
		RegModuleDO regModuleDO;
		try {
			regModuleDO = regModuleRepository.findById(moduleId).orElse(null);
			if (regModuleDO == null) {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new ServiceException(e.getMessage());
		}
		
		// 查询模块下的所有模块项
		List<RegModuleItemDO> regModuleItemDOs = regModuleItemRepository.findByModuleId(regModuleDO.getModuleId());
		List<Object> moduleItemDTOs = new ArrayList<>();
		if (regModuleItemDOs != null) {
			for (RegModuleItemDO regModuleItemDO: regModuleItemDOs) {
				// 获取属主类型
				Short ownerType = regModuleItemDO.getModuleItemOwnerType();
				switch (ownerType) {
				// TODO 店铺类型写死了
				case 1:
					// 查询店铺详情
					ShopService shopService = (ShopService) applicationContext.getBean("shopService");
					ModuleItemDTO shopModuleItemDTO = shopService.getShopDetail(regModuleItemDO.getModuleItemOwnerId());
					// 设置模块类型
					shopModuleItemDTO.setModuleItemType(EntityEnum.SHOP.getEntityValue());
					// 添加到列表
					moduleItemDTOs.add(shopModuleItemDTO);
					
					break;
				// TODO 项目类型写死了	
				case 2:
					// 查询项目详情
					ItemService itemService = (ItemService) applicationContext.getBean("itemService");
					ModuleItemDTO itemDetailDTO = itemService.getItemDetail(regModuleItemDO.getModuleItemOwnerId());
					// 设置模块类型
					itemDetailDTO.setModuleItemType(EntityEnum.ITEM.getEntityValue());

					// 添加到列表
					moduleItemDTOs.add(itemDetailDTO);
					break;
				case 4:
				    // 广告
                    ModuleItemDTO advertismentDetailDTO = new ModuleItemDTO();
                    advertismentDetailDTO.setModuleItemImage(regModuleItemDO.getModuleItemImage());
                    advertismentDetailDTO.setModuleItemUrl(regModuleItemDO.getModuleItemUrl());
                    advertismentDetailDTO.setModuleItemType(regModuleItemDO.getModuleItemOwnerType());
                    moduleItemDTOs.add(advertismentDetailDTO);
                    break;
				default:
				}
			}
			moduleDTO.setModuleItems(moduleItemDTOs);
			System.out.println("模块查询："+moduleDTO.toString());
		}
		
		return moduleDTO;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}

}
